export default {
  // 开启命名空间
  namespaced: true,
  
  // 返回一个数据节点对象
  state: () => ({
    // 购物车的数组，用来存储购物车中每个商品的信息对象
    // 每个商品的信息对象，都包含如下 6 个属性：
    // { goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
    cart: JSON.parse(uni.getStorageSync("cart") || '[]')
  }),
  
  // 模块的 mutation 方法  state里面的数据只能在mutations方法里面修改
  mutations: {
    // 默认第一个参数是上面的 本地的store中的state
    // 第二个参数是可以由使用该方法传过来的参数值
    // 默认第三个参数是 根store中的state ，例如这里的 根sotre 就是 store.js里面的Vuex.Store({})
    addGoodsToCart(state, goods, rootState) {
      // 判断该商品是否已经存在购物
      // find 方法，如果找到则返回该 item 的地址指向(因此可以直接修改后影响到原对象)，找不到则返回 undefined
      let findResult = state.cart.find(item => item.goods_id === goods.goods_id)
      if(!findResult) {
        state.cart.push(goods)
      } else {
        findResult.goods_count ++
      }
      
      // 每次修改后就 持久化存储数据  this.commit 调用 mutations节点下的 方法成员， 参数'哪个store(开启了命名空间的)/哪个方法'
      this.commit('m_cart/saveToStorage')
    },
    // 持久化存储数据
    saveToStorage(state) {
      uni.setStorageSync("cart", JSON.stringify(state.cart))
    },
    // 修改状态state
    changeGoodsState(state, idAndStateObj) {
      /**
       * idAndStateObj 的 值
       * { goods_id: xxx, goods_state: false|true }
       */
      const curGoods = state.cart.find(item => item.goods_id === idAndStateObj.goods_id)
      if(curGoods) {
        curGoods.goods_state = idAndStateObj.goods_state // curGoods 存在再操作
        // 将最新cart状态 持久化存储
        this.commit('m_cart/saveToStorage')
      }
    },
    // 修改数量
    changeGoodsCount(state, idAndCountObj) {
      const curGoods = state.cart.find(item => item.goods_id === idAndCountObj.goods_id)
      if(curGoods) {
        curGoods.goods_count = idAndCountObj.goods_count
        this.commit('m_cart/saveToStorage')
      }
    },
    // 根据id删除某项商品
    deleteGoods(state, goodsId) {
      state.cart = state.cart.filter(item => item.goods_id != goodsId)
      this.commit('m_cart/saveToStorage')
    },
    /**
     * 改变 cart 中所有 goods 的 goods_state 为统一值
     * @param {Object} state 
     * @param {Object} unifyStateVal 统一的状态值
     */
    changeStateForUnify(state, unifyStateVal) {
      // 这里扩展一下：
      // forEach()会修改原来的数组。而map()方法会得到一个新的数组并返回
      state.cart.forEach(goods => goods.goods_state = unifyStateVal)
      // 修改完记得持久化存储
      this.commit('m_cart/saveToStorage')
    },
    // 批量清楚购物车商品
    deleteMany(state, residueGoodsArr) {
      // 直接将剩余的购物车商品项传过来覆盖赋值就行，然后再进行存储
      state.cart = residueGoodsArr
      this.commit('m_cart/saveToStorage')
    }
  },
  // 模块的 getters 属性  相当于计算属性
  getters: {
    total(state) {
      // amt 为临时累加变量， 最后返回的结果就是累加后的值 赋值给 count
      let count = state.cart.reduce((amt, item) => (amt += item.goods_count), 0)
      return count
    },
    checkedAmount(state) {
      // 过滤出cart中被选中的goods，并且累加它们的数量和价格的乘积
      return state.cart.filter(goods => goods.goods_state == true).reduce((am, item) => am += item.goods_count * item.goods_price, 0)
    },
    checkedCount(state) {
      // 所有选中后的数量和
      return state.cart.filter(goods => goods.goods_state == true).reduce((am, item) => am += item.goods_count, 0)
    },
    isCheckedAll(state) {
      // 判断是否全部勾选 全部勾选才为true
      // every 只有所有返回值为 true 结果才为 true
      return state.cart.every(goods => goods.goods_state)
    }
  },
}